/**
 * Vue CLI 3 配置
 * Vue CLI文档地址：https://cli.vuejs.org/zh/config/#vue-config-js
 * Nodejs文档地址：http://nodejs.cn/api/
 * 该文件采用commonjs语法，也会调用nodejs变量和方法
 * @type {{outputDir: string, isMock: boolean, iviewLoaderOptions: {prefix: boolean}, assetsDir: string, lintOnSave: boolean, publicPath: string}}
 */
//加载开发配置文件./src/setting.env.js
const Setting = require('./src/setting.env');

// 定义拼接路径的函数，require('path')是nodejs的方法，获取绝对路径
const resolve = dir => require('path').join(__dirname, dir);
// process为nodejs的全局变量，修改环境变量
process.env.VUE_APP_VERSION = require('./package.json').version;
process.env.VUE_APP_BUILD_TIME = require('dayjs')().format('YYYY-M-D HH:mm:ss');

//修改webpack配置
module.exports = {
    //部署应用包时的基本 URL，用法和 webpack 本身的 output.publicPath 一致
    publicPath: Setting.publicPath,
    //是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码。这个值会在 @vue/cli-plugin-eslint 被安装之后生效。
    lintOnSave: Setting.lintOnSave,
    //当运行 vue-cli-service build 时生成的生产环境构建文件的目录，类似webpack 的 output.path
    outputDir: Setting.outputDir,
    //放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
    assetsDir: Setting.assetsDir,
    //是否使用包含运行时编译器的 Vue 构建版本。设置为 true 后你就可以在 Vue 组件中使用 template 选项了，但是这会让你的应用额外增加 10kb 左右。
    runtimeCompiler: true,
    //如果你不需要生产环境的 source map，可以将其设置为 false 以加速生产环境构建。
    productionSourceMap: false,
    //所有 webpack-dev-server 的选项都支持
    devServer: {
        publicPath: Setting.publicPath,
        port: 8081,
    },
    //向 CSS 相关的 loader 传递选项。
    css: {
        loaderOptions: {
            less:{

            },
        }
    },
    productionSourceMap: false,
    configureWebpack: config => {
        const env = process.env.NODE_ENV
        config.devtool = env === 'development' ? 'source-map' : 'cheap-source-map'
        if (env === 'development') {
            config.output.devtoolModuleFilenameTemplate = info => {
                const resPath = info.resourcePath
                return `webpack:///${resPath}?${info.hash}`
            }
        }
    },
    transpileDependencies: ['view-design'],
    chainWebpack: config => {
        /**
         * 删除懒加载模块的 prefetch preload，降低带宽压力
         * https://cli.vuejs.org/zh/guide/html-and-static-assets.html#prefetch
         * https://cli.vuejs.org/zh/guide/html-and-static-assets.html#preload
         * 而且预渲染时生成的 prefetch 标签是 modern 版本的，低版本浏览器是不需要的
         */
        config.plugins
            .delete('prefetch')
            .delete('preload')
        config
            // 开发环境
            .when(process.env.NODE_ENV === 'development',
                // sourcemap不包含列信息
                config => config.devtool('source-map')
            )
            // 非开发环境
            .when(process.env.NODE_ENV !== 'development', config => {

            });
        // 解决 cli3 热更新失效 https://github.com/vuejs/vue-cli/issues/1559
        config.resolve
            .symlinks(true);
        config.resolve.alias
            // key,value自行定义，比如.set('@assets', resolve('src/assets'))
            .set('public',resolve('../public'))
            .set('@',resolve('src'))
        // 不编译 iView Pro
        //配置加载loader工具
        config.module
            .rule('js')
            .test(/\.jsx?$/)
            .exclude
            .add(resolve('../public/iview-pro'))
            .end();
        config.module
            .rule('js')
            .test(/\.jsx?$/)
            .exclude
            .add(resolve('../public/iview-sidebar'))
            .end();
        // 使用 iView Loader
        config.module
            .rule('vue')
            .test(/\.vue$/)
            .use('iview-loader')
            .loader('iview-loader')
            .tap(() => {
                return Setting.iviewLoaderOptions
            })
            .end();
        // markdown
        config.module
            .rule('md')
            .test(/\.md$/)
            .use('text-loader')
            .loader('text-loader')
            .end();
        // i18n
        config.module
            .rule('i18n')
            .resourceQuery(/blockType=i18n/)
            .use('i18n')
            .loader('@kazupon/vue-i18n-loader')
            .end();
        // image exclude
        const imagesRule = config.module.rule('images');
        imagesRule
            .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
            .exclude
            .add(resolve('src/assets/svg'))
            .end();
        // 重新设置 alias
        config.resolve.alias
            .set('@api', resolve('src/api'));
        // node
        config.node
            .set('__dirname', true)
            .set('__filename', true);
        // 判断是否需要加入模拟数据
        const entry = config.entry('app');
        // if (Setting.isMock) {
        //     entry
        //         .add('@/mock')
        //         .end()
        // }
    }
};
